home *** CD-ROM | disk | FTP | other *** search
- #include "wand_head.h"
-
- extern void draw_symbol();
- extern int debug_disp;
- extern char screen[NOOFROWS][ROWLEN+1];
-
- int check(mx,my,x,y,dx,dy,sx,sy,howdead)
- /* check for any falling caused by something moving out of x,y along
- vector dx,dy. All the others are constant and should really have
- been global... */
- int x,y,sx,sy,dx,dy, *mx, *my;
- char howdead[25];
- {
- int ret=0;
- ret+=fall(mx,my,x,y,sx,sy,howdead);
- ret+=fall(mx,my,x-dx,y-dy,sx,sy,howdead);
- ret+=fall(mx,my,x-dy,y-dx,sx,sy,howdead);
- ret+=fall(mx,my,x+dy,y+dx,sx,sy,howdead);
- ret+=fall(mx,my,x-dx-dy,y-dy-dx,sx,sy,howdead);
- ret+=fall(mx,my,x-dx+dy,y-dy+dx,sx,sy,howdead);
- return ret;
- }
-
- int fall(mx,my,x,y,sx,sy,howdead) /* recursive function for falling */
- /* boulders and arrows */
- int x,y,sx,sy, *mx, *my;
- char howdead[25];
- {
- int nx = x,nyl = y,nyr = y,retval = 0;
- if ((y>(NOOFROWS-1))||(y<0)||(x<0)||(x>(ROWLEN-1)))
- return(0);
- if((screen[y][x] != 'O') && (screen[y][x] != ' ') && (screen[y][x] != 'M') &&
- (screen[y][x] !='\\') && (screen[y][x] != '/') && (screen[y][x] != '@'))
- return(0);
- if(screen[y][x] == 'O')
- {
- if((screen[y][x-1] == ' ') && (screen[y-1][x-1] == ' '))
- nx--;
- else
- {
- if((screen[y][x+1] == ' ') && (screen[y-1][x+1] == ' '))
- nx++;
- else
- nx = -1;
- }
- if((screen[y-1][x] == ' ') && (screen[y-1][x+1] == ' '))
- nyr--;
- else
- {
- if((screen[y+1][x] == ' ') && (screen[y+1][x+1] == ' '))
- nyr++;
- else
- nyr = -1;
- }
- if((screen[y-1][x] == ' ') && (screen[y-1][x-1] == ' '))
- nyl--;
- else
- {
- if((screen[y+1][x] == ' ') && (screen[y+1][x-1] == ' '))
- nyl++;
- else
- nyl = -1;
- }
- }
- if(screen[y][x] == '\\')
- {
- if(screen[y-1][++nx] != ' ')
- nx = -1;
- if(screen[--nyr][x+1] != ' ')
- nyr = -1;
- if(screen[++nyl][x-1] != ' ')
- nyl = -1;
- }
- if(screen[y][x] == '/')
- {
- if(screen[y-1][--nx] != ' ')
- nx = -1;
- if(screen[++nyr][x+1] != ' ')
- nyr = -1;
- if(screen[--nyl][x-1] != ' ')
- nyl = -1;
- }
- if((screen[y][nx] != ' ') && (screen[y][nx] != 'M'))
- nx = -1;
- if((screen[y-1][x] == 'O') && (nx >= 0) && (y > 0)) /* boulder falls ? */
- {
- screen[y-1][x] = ' ';
- if(screen[y][nx] == '@')
- {
- strcpy(howdead,"a falling boulder");
- retval=1;
- }
- if(screen[y][nx] == 'M')
- {
- *mx = *my = -2;
- screen[y][nx] = ' ';
- }
- screen[y][nx] = 'O';
- if(!debug_disp)
- {
- if((y<(sy+5)) && (y>(sy-3)) && (x>(sx-6)) && (x<(sx+6)))
- draw_symbol((x-sx+5)*3,(y-sy+2)*2,' ');
- if((y<(sy+4)) && (y>(sy-4)) && (nx>(sx-6)) && (nx<(sx+6)))
- draw_symbol((nx-sx+5)*3,(y-sy+3)*2,'O');
- }
- else
- {
- move(y,x+1);
- addch(' ');;
- move(y+1,nx+1);
- addch('O');
- }
- refresh();
- retval+=fall(mx,my,nx ,y+1,sx,sy,howdead);
- retval+=check(mx,my,x,y-1,0,1,sx,sy,howdead);
- if(screen[y+1][nx] == '@')
- {
- strcpy(howdead,"a falling boulder");
- return(1);
- }
- if(screen[y+1][nx] == 'M')
- {
- *mx = *my = -2;
- screen[y+1][nx] = ' ';
- }
- }
- if((screen[nyr][x] != ' ')&&(screen[nyr][x] != 'M'))
- nyr = -1;
- if((screen[y][x+1] == '<')&&(nyr>=0)&&(x+1<ROWLEN)) /* arrow moves ( < ) ? */
- {
- screen[y][x+1] = ' ';
- if(screen[nyr][x] == '@')
- {
- strcpy(howdead,"a speeding arrow");
- retval = 1;
- }
- if(screen[nyr][x] == 'M')
- {
- *mx = *my = -2;
- screen[nyr][x] = ' ';
- }
- screen[nyr][x] = '<';
- if(!debug_disp)
- {
- if((y<(sy+4)) && (y>(sy-4)) && (x<(sx+5)) && (x>(sx-7)))
- draw_symbol((x-sx+6)*3,(y-sy+3)*2,' ');
- if((nyr<(sy+4)) && (nyr>(sy-4)) && (x<(sx+6)) && (x>(sx-6)))
- draw_symbol((x-sx+5)*3,(nyr-sy+3)*2,'<');
- }
- else
- {
- move(y+1,x+2);
- addch(' ');
- move(nyr+1,x+1);
- addch('<');
- }
- refresh();
- retval+=fall(mx,my,x-1,nyr,sx,sy,howdead);
- retval+=check(mx,my,x+1,y,-1,0,sx,sy,howdead);
- if(screen[nyr][x-1] == '@')
- {
- strcpy(howdead,"a speeding arrow");
- return(1);
- }
- if(screen[nyr][x-1] == 'M')
- {
- *mx = *my = -2;
- screen[nyr][x-1] = ' ';
- }
- }
- if((screen[nyl][x] != ' ')&&(screen[nyl][x] != 'M'))
- nyl = -1;
- if((screen[y][x-1] == '>')&&(nyl>=0)&&(x>0)) /* arrow moves ( > ) ? */
- {
- screen[y][x-1] = ' ';
- if(screen[nyl][x] == '@')
- {
- strcpy(howdead,"a speeding arrow");
- retval = 1;
- }
- if(screen[nyl][x] == 'M')
- {
- *mx = *my = -2;
- screen[nyl][x] = ' ';
- }
- screen[nyl][x] = '>';
- if(!debug_disp)
- {
- if((y<(sy+4)) && (y>(sy-4)) && (x<(sx+7)) && (x>(sx-5)))
- draw_symbol((x-sx+4)*3,(y-sy+3)*2,' ');
- if((nyl<(sy+4)) && (nyl>(sy-4)) && (x<(sx+6)) && (x>(sx-6)))
- draw_symbol((x-sx+5)*3,(nyl-sy+3)*2,'>');
- }
- else
- {
- move(y+1,x);
- addch(' ');
- move(nyl+1,x+1);
- addch('>');
- }
- refresh();
- retval+=fall(mx,my,x+1,nyl,sx,sy,howdead);
- retval+=check(mx,my,x-1,y,1,0,sx,sy,howdead);
- if(screen[nyl][x+1] == '@')
- {
- strcpy(howdead,"a speeding arrow");
- return(1);
- }
- if(screen[nyl][x+1] == 'M')
- {
- *mx = *my = -2;
- screen[nyl][x+1] = ' ';
- }
- }
- if(retval>0)
- return(1);
- return(0);
- }
-